/*@ author cerimice*/
package Reportes.PDF.Apartado;

import Persistencia.Definicion.Apartado;
import Persistencia.Definicion.SeguimientoApartado;
import Persistencia.Fachada.ApartadoFachada;
import Reportes.PDF.Formato;
import Sistema.Configuracion;
import com.itextpdf.text.Document;
import com.itextpdf.text.Element;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.vaadin.terminal.StreamResource;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.Collection;
import java.util.logging.Logger;


public class ReporteGenerarApartado implements StreamResource.StreamSource
    {
    private Apartado        apartado;
    private ApartadoFachada fachada;
    
    private Formato                     formato;
    private DecimalFormat               formatoNumero;
    private final ByteArrayOutputStream archivoPDF;
    
    public ReporteGenerarApartado(String clave) throws Exception
        {
        fachada         = new ApartadoFachada();
        formato         = new Formato();
        formatoNumero   = new DecimalFormat("$#,###,##0.00");
        archivoPDF      =  new ByteArrayOutputStream();
        this.generarReporte(clave);
        }
    
    private void generarReporte(String clave) throws Exception
        {
        Document document = null;
        try
            {
            apartado = fachada.obtener(clave);
            document = new Document(PageSize.A5.rotate(),10,10,10,10);
            PdfWriter.getInstance(document,archivoPDF);
            document.open();
                document.add(formato.generarEncabezado("APARTADO"));
                document.add(generarTitulo());
                document.add(generarCuerpo());
            }
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage()); throw ex;}
        finally
            {if (document != null){document.close();}}
        }
    
    private Paragraph generarTitulo()
        {
        Paragraph titulo = new Paragraph();
            titulo.add(new Paragraph("FOLIO APARTADO:     ", formato.getFuenteTexto()));
            titulo.add(new Paragraph(apartado.getClave()+"     ", formato.getFuenteSubtitulo()));
            titulo.setAlignment(Element.ALIGN_RIGHT);
        return titulo;
        }
    
    private Paragraph generarCuerpo()
        {
        Paragraph cuerpo = new Paragraph();
            PdfPTable tabla = new PdfPTable(2);
                PdfPCell celda1   = new PdfPCell ();
                    Paragraph cuerpoCelda1 = new Paragraph();
                        cuerpoCelda1.add(new Paragraph("DATOS APARTADO", formato.getFuenteTitulo()));
                        cuerpoCelda1.add(new Paragraph("CLIENTE:", formato.getFuenteSubtitulo()));
                        cuerpoCelda1.add(new Paragraph(apartado.getObjCliente().getNombreCompleto(),formato.getFuenteTexto()));
                        cuerpoCelda1.add(new Paragraph("DESCRIPCIÓN:", formato.getFuenteSubtitulo()));
                        cuerpoCelda1.add(new Paragraph(apartado.getDescripcion(),formato.getFuenteTexto()));
                        cuerpoCelda1.add(new Paragraph("MARCA: ", formato.getFuenteSubtitulo()));
                        cuerpoCelda1.add(new Paragraph(apartado.getObjMarca().getNombre(),formato.getFuenteTexto()));
                        cuerpoCelda1.add(new Paragraph("NUMERO DE SERIE:", formato.getFuenteSubtitulo()));
                        cuerpoCelda1.add(new Paragraph(apartado.getNumeroSerie(), formato.getFuenteTexto()));
                        cuerpoCelda1.add(new Paragraph("FECHA DE INICIO:", formato.getFuenteSubtitulo()));
                        cuerpoCelda1.add(new Paragraph(Configuracion.getFormatoFechaLarga().format(apartado.getFechaInicio()),formato.getFuenteTexto()));
                        cuerpoCelda1.add(new Paragraph("FECHA DE TERMINO:", formato.getFuenteSubtitulo()));
                        cuerpoCelda1.add(new Paragraph(Configuracion.getFormatoFechaLarga().format(apartado.getFechaTermino()),formato.getFuenteTexto()));
                    celda1.addElement(cuerpoCelda1);
                    celda1.setBorder(0);
                PdfPCell celda2   = new PdfPCell ();
                    Paragraph cuerpoCelda2 = new Paragraph();
                        cuerpoCelda2.add(new Paragraph("PAGOS REALIZADOS", formato.getFuenteTitulo()));
                            float   pago    = 0;
                            String  cadena  = "";
                            Collection<SeguimientoApartado> pagos = apartado.getSeguimiento();
                            for(SeguimientoApartado obj:pagos)
                                {
                                pago += obj.getMonto();
                                cadena += "FECHA: "+Configuracion.getFormatoFechaCorta().format(obj.getFecha()) + " ";
                                cadena += "MONTO: "+formatoNumero.format(obj.getMonto());
                                /*if(!obj.getComentario().equals(""))
                                    {cadena +="\n" + obj.getComentario();}*/
                                cuerpoCelda2.add(new Paragraph(cadena,formato.getFuenteTexto()));
                                }
                            cuerpoCelda2.add(new Paragraph("MONTO TOTAL: "+formatoNumero.format(apartado.getMontoTotal()),formato.getFuenteSubtitulo()));
                            cuerpoCelda2.add(new Paragraph("ADEUDO TOTAL: "+formatoNumero.format(apartado.getMontoTotal()-pago),formato.getFuenteTitulo()));
                    celda2.addElement(cuerpoCelda2);
                    celda2.setBorder(0);
                tabla.addCell(celda1);
                tabla.addCell(celda2);
            cuerpo.add(tabla);
        return cuerpo;
        }
    
    @Override
    public InputStream getStream()
        {return new ByteArrayInputStream(archivoPDF.toByteArray());}
    }
